#ifndef __CLISTCTRLEX_H__
#define __CLISTCTRLEX_H__

#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions
#include <afxcmn.h>             // MFC support for Windows Common Controls
#include <map>
#include <vector>
#include <string>

#define IDC_CELLEDIT	1003


/************************************************************************************************/
/*									CHeaderCtrlEx													*/
/************************************************************************************************/

class CHeaderCtrlEx : public CHeaderCtrl
{
	DECLARE_DYNAMIC(CHeaderCtrlEx)

public:
	CHeaderCtrlEx();
	virtual ~CHeaderCtrlEx();

protected:
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnPaint();
	CStringArray m_HChar;
	CString m_Format; //表示对齐类型的整型数组,0表示左对齐，1表示中间对齐，2表示右对齐
public:
	int m_R;
	int m_G;
	int m_B;
	int m_Gradient;	// 画立体背景，渐变系数
	float m_Height;  //表头高度，这是倍数,
	int m_fontHeight; //字体高度
	int m_fontWith;   //字体宽度
	COLORREF m_color;
	LRESULT OnLayout( WPARAM wParam, LPARAM lParam );
};



/************************************************************************************************/
/*									CListCtrlEx													*/
/************************************************************************************************/

class CListCtrlEx : public CListCtrl
{
public:
	class Listener
	{
	public:
		virtual int OnItemRClick(CListCtrlEx *pThis, int iRow){ return 0; }; // 暂未实现
		virtual int OnItemLDBClick(CListCtrlEx *pThis, int iRow){ return 0; }; // 暂未实现
		// 包括button点击事件
		virtual int OnEditEnd(CListCtrlEx *pThis, int iRow, int iCol, CWnd *pCtrl, const char *pText, int value){ return 0; }; 
		virtual int OnChecked(CListCtrlEx *pThis, int iRow, bool isChecked){ return 0; };
		virtual int OnItemLClick(CListCtrlEx *pThis, int iRow){ return 0; };
	};

	CListCtrlEx();
	virtual ~CListCtrlEx();

	enum ECtrl{Edit,ComboBox,ClkText};
	class CCtrl
	{
	public:
		CWnd *pCtrl;
		ECtrl eType;
	};

private:
	struct CurCCtrl
	{
		int iRow;
		int iCol;
		CCtrl *pCCtrl;
	}m_curCCtrl;
	std::map<int, CCtrl> m_mapCtrl;

	CFont *mFont;
	RECT mOldRect;
	unsigned int m_CellEditMask;
	
	COLORREF m_defClrText;
	COLORREF m_defClrTextBk;

	struct DRAWPEN
	{
		int row;
		int col;
		COLORREF clrTextBk;
		COLORREF clrText;
	};

	std::vector<std::vector<DRAWPEN>> m_clrData;	

	
// 函数
public:
	void EnableCellEdit(int row,int col,CRect rect,CString text);
	void SetListener(Listener *pListener);
	CWnd *BindCtrl(int col,ECtrl ctrl);
	bool HideCCtrl();
	void DrawSelEffect(RECT rt);

protected:
	Listener  *m_pListener;
	
	//新成员*********************************************************************************
public:
	BOOL SetTextColor(int iItem,int subItem,COLORREF rgb);
	BOOL SetCellColor(int iItem,int subItem,COLORREF rgb);
	
public:
	DECLARE_MESSAGE_MAP()
	afx_msg void OnCellCtrlEnd();
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnLvnColumnclick(NMHDR *pNMHDR, LRESULT *pResult);
//	afx_msg void OnLvnBeginScroll(NMHDR *pNMHDR, LRESULT *pResult);
	afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
	afx_msg void OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult);
	afx_msg void OnDeleteitem(NMHDR *pNMHDR, LRESULT *pResult);
	afx_msg void OnInsertitem(NMHDR *pNMHDR, LRESULT *pResult);
	afx_msg void OnDeleteallitems(NMHDR *pNMHDR, LRESULT *pResult);
};


#endif